const { add, find, update, del, addAll } = require("../../server");
const user = require("../../model/users");
const user1 = require("../../model/users1");
//加密token
const { sign, verify } = require("../../utils/jwt");

//查询全部数据 /admin/user/usersAll
const getCtr = async (req, res, next) => {
  try {
    let data = await find(user);
    res.send({
      code: 200,
      data,
    });
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};

//模糊查询
const getCtr1 = async (req, res, next) => {
  let tiao = req.query;
  if (tiao.status) {
    try {
      let data = await find(user, {
        username: tiao.username,
      });
      let data1 = await find(user, {
        status: Number(tiao.status),
      });
      let data2 = await find(user, {
        username: tiao.username,
        status: Number(tiao.status),
      });
      if (tiao.username == "" && tiao.status != "") {
        res.send({
          code: 200,
          data: data1,
        });
      } else {
        if (tiao.username != "" && tiao.status == "") {
          res.send({
            code: 200,
            data: data,
          });
        } else {
          res.send({
            code: 200,
            data: data2,
          });
        }
      }
    } catch (err) {
      console.log(err);
      res.send({
        code: 400,
        message: "数据查询失败",
      });
    }
  } else {
    try {
      let data = await find(user, {
        username: tiao.username,
      });
      let data1 = await find(user, {
        role: Number(tiao.role),
      });
      let data2 = await find(user, {
        username: tiao.username,
        role: Number(tiao.role),
      });
      if (tiao.username == "" && tiao.role != "") {
        res.send({
          code: 200,
          data: data1,
        });
      } else {
        if (tiao.username != "" && tiao.role == "") {
          res.send({
            code: 200,
            data: data,
          });
        } else {
          res.send({
            code: 200,
            data: data2,
          });
        }
      }
    } catch (err) {
      console.log(err);
      res.send({
        code: 400,
        message: "数据查询失败",
      });
    }
  }
};
// 个人信息查询
const getCtr2 = async (req, res, next) => {
  let tiao = req.query;
  try {
    let data = await find(user, {
      username: tiao.username,
    });
    res.send({
      code: 200,
      data: data,
    });
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};
// 登陆判断
const getCtr3 = async (req, res, next) => {
  let tiao = req.query;
  try {
    let data1 = await find(user, {
      username: tiao.username,
    });
    if (data1.length == 0) {
      res.send({
        code: 400,
        message: "账号不存在",
      });
    } else {
      let data2 = await find(user, {
        username: tiao.username,
        password: tiao.password,
      });
      if (data2.length == 0) {
        res.send({
          code: 400,
          message: "密码错误",
        });
      } else {
        let loginChange = await update(
          user,
          {
            created_login: tiao.created_login,
          },
          {
            id: data2[0].id,
          }
        );
        if (data2[0].status == 1) {
          // token7天过期 7days
          let token = sign(tiao.username, "7days");
          res.send({
            code: 200,
            token,
            message: "登录成功",
          });
        } else {
          res.send({
            code: 400,
            message: "您的账号被冻结，请联系超级管理员",
          });
        }
      }
    }
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};

// 手机号验证码登录
const findTel = async (req, res, next) => {
  let tiao = req.query;
  let vei = ''
  try {
    let tel = await find(user, {
      phone_number: tiao.tel,
    });
    if (tel.length == 0) {
      res.send({
        code: 400,
        message: "此手机号未绑定账号，请绑定后再来",
      });
    } else {
      for (let i = 0; i < 4; i++) {
        let ran = Math.floor(Math.random() * 10)
        vei += ran
      }
      let tel = tiao.tel
      //后端再通过调用短信服务的API，给手机号码发送验证码 - 需要手动下载引入的模块 tencentcloud - sdk - nodejs
      const tencentcloud = require("tencentcloud-sdk-nodejs")
      // 导入对应产品模块的client models。
      const smsClient = tencentcloud.sms.v20210111.Client

      /* 实例化要请求产品(以sms为例)的client对象 */
      const client = new smsClient({
        credential: {
          /* 必填：腾讯云账户密钥对secretId，secretKey。
           * 这里采用的是从环境变量读取的方式，需要在环境变量中先设置这两个值。
           * 你也可以直接在代码中写死密钥对，但是小心不要将代码复制、上传或者分享给他人，
           * 以免泄露密钥对危及你的财产安全。
           * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */
          // secretId: process.env.secretId,
          // secretKey: process.env.secretKey,
          secretId: "AKID0pSr1wd4GFxPcZIo55rNeeYNzQiw0vd6",
          secretKey: "KbFeyA9tO0NbfibGl346tRlqjeWBj6FB",
        },
        /* 必填：地域信息，可以直接填写字符串ap-guangzhou，支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
        region: "ap-guangzhou",
        /* 非必填:
         * 客户端配置对象，可以指定超时时间等配置 */
        profile: {
          /* SDK默认用TC3-HMAC-SHA256进行签名，非必要请不要修改这个字段 */
          signMethod: "HmacSHA256",
          httpProfile: {
            /* SDK默认使用POST方法。
             * 如果你一定要使用GET方法，可以在这里设置。GET方法无法处理一些较大的请求 */
            reqMethod: "POST",
            /* SDK有默认的超时时间，非必要请不要进行调整
             * 如有需要请在代码中查阅以获取最新的默认值 */
            reqTimeout: 30,
            /**
             * 指定接入地域域名，默认就近地域接入域名为 sms.tencentcloudapi.com ，也支持指定地域域名访问，例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com
             */
            endpoint: "sms.tencentcloudapi.com"
          },
        },
      })

      /* 请求参数，根据调用的接口和实际情况，可以进一步设置请求参数
       * 属性可能是基本类型，也可能引用了另一个数据结构
       * 推荐使用IDE进行开发，可以方便的跳转查阅各个接口和数据结构的文档说明 */
      /* 帮助链接：
       * 短信控制台: https://console.cloud.tencent.com/smsv2
       * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
      const params = {
        /* 短信应用ID: 短信SmsSdkAppId在 [短信控制台] 添加应用后生成的实际SmsSdkAppId，示例如1400006666 */
        // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
        //   SmsSdkAppId: "1400787878",
        SmsSdkAppId: "1400820353",
        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名 */
        // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
        // SignName: "腾讯云",
        SignName: "dx1126Cn个人网",
        /* 模板 ID: 必须填写已审核通过的模板 ID */
        // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
        //   TemplateId: "449739",
        TemplateId: "1793556",
        /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空 */

        // 模板中定义了2个参数，第一个4位数的随机验证码，第二个为几分钟过期
        TemplateParamSet: [vei, 60],
        /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
         * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
        //   PhoneNumberSet: ["+8613711112222"], 
        PhoneNumberSet: [tel],
        /* 用户的 session 内容（无需要可忽略）: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
        SessionContext: "",
        /* 短信码号扩展号（无需要可忽略）: 默认未开通，如需开通请联系 [腾讯云短信小助手] */
        ExtendCode: "",
        /* 国内短信无需填写该项；国际/港澳台短信已申请独立 SenderId 需要填写该字段，默认使用公共 SenderId，无需填写该字段。注：月度使用量达到指定量级可申请独立 SenderId 使用，详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 */
        SenderId: "",
      }
      // 通过client对象调用想要访问的接口，需要传入请求对象以及响应回调函数
      client.SendSms(params, function (err, response) {
        // 请求异常返回，打印异常信息
        if (err) {
          console.log('err', err)
          return
        }
        // 请求正常返回，打印response对象
        // console.log('response', response)

        if (response.SendStatusSet[0].Code == 'Ok') {
          res.send({
            code: 200,
            verify: vei,
            message: "发送成功",
          });
        }
      })
    }

  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};

// 手机号个人信息查询
const getCtr4 = async (req, res, next) => {
  let tiao = req.query;
  try {
    let data = await find(user, {
      phone_number: tiao.tel,
    });
    let loginChange = await update(
      user,
      {
        created_login: tiao.created_login,
      },
      {
        phone_number: tiao.tel,
      }
    );
    if (data[0].status == 1) {
      // token7天过期 7days
      let token = sign(data[0].username, "7days");
      res.send({
        code: 200,
        data: data[0],
        token,
        message: "登录成功",
      });
    } else {
      res.send({
        code: 400,
        message: "您的账号被冻结，请联系超级管理员",
      });
    }
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};


//增加  /admin/user/users
const postCtr = async (req, res, next) => {
  let data = req.body;
  try {
    let users = await find(user, {
      username: data.username,
    });
    if (users.length == 0) {
      data.url = "http://localhost:3000/img/img.jpg";
      try {
        await add(user, data);
        res.send({
          code: 200,
          message: "增加成功",
        });
      } catch (error) {
        console.log(error);
        res.send({
          code: 400,
          message: "增加失败",
        });
      }
    } else {
      res.send({
        code: 400,
        message: "用户已经存在",
      });
    }
  } catch (error) { }
};

// 文件导入
const postCtr1 = async (req, res, next) => {
  let data = req.body;
  try {
    await addAll(user, data);
    res.send({
      code: 200,
      message: "数据插入成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: 400,
      message: "数据插入失败",
    });
  }
};


// 信息修改
const putCtr = async (req, res, next) => {
  let data = req.body;
  try {
    let bob = await update(user, data.newTableDate, {
      id: data.id,
    });
    if (bob == 0) {
      res.send({
        code: 400,
        message: "未进行修改操作",
      });
      return;
    }
    res.send({
      code: 200,
      message: "修改成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: 400,
      message: "修改失败，请联系超级管理员",
    });
  }
};

// 删除数据
const delCtr = async (req, res, next) => {
  try {
    let bob = await del(user, {
      id: req.body.id,
    });
    if (bob == 0) {
      res.send({
        code: 400,
        message: "删除失败，请联系程序员",
      });
      return;
    }
    res.send({
      code: 200,
      message: "删除成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: 400,
      message: "删除失败，请联系程序员",
    });
  }
};


//=========================回收站============================
//查询全部数据 /admin/user/usersAll
const getRecycle = async (req, res, next) => {
  try {
    let data = await find(user1);
    res.send({
      code: 200,
      data,
    });
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }
};

//模糊查询
const getRecycles = async (req, res, next) => {
  let tiao = req.query;

  try {
    let data = await find(user1, {
      username: tiao.username,
    });
    let data1 = await find(user1, {
      role: Number(tiao.role),
    });
    let data2 = await find(user1, {
      username: tiao.username,
      role: Number(tiao.role),
    });
    if (tiao.username == "" && tiao.role != "") {
      res.send({
        code: 200,
        data: data1,
      });
    } else {
      if (tiao.username != "" && tiao.role == "") {
        res.send({
          code: 200,
          data: data,
        });
      } else {
        res.send({
          code: 200,
          data: data2,
        });
      }
    }
  } catch (err) {
    console.log(err);
    res.send({
      code: 400,
      message: "数据查询失败",
    });
  }

};

//增加  
const postRecycle = async (req, res, next) => {
  let data = req.body;
  try {
    let users = await find(user1, {
      username: data.username,
    });
    if (users.length == 0) {
      data.url = "http://localhost:3000/img/img.jpg";
      try {
        await add(user1, data);
        res.send({
          code: 200,
          message: "增加成功",
        });
      } catch (error) {
        console.log(error);
        res.send({
          code: 400,
          message: "增加失败",
        });
      }
    } else {
      res.send({
        code: 400,
        message: "用户已经存在",
      });
    }
  } catch (error) { }
};

// 删除数据
const delRecycle = async (req, res, next) => {
  try {
    let bob = await del(user1, {
      id: req.body.id,
    });
    if (bob == 0) {
      res.send({
        code: 400,
        message: "删除失败，请联系程序员",
      });
      return;
    }
    res.send({
      code: 200,
      message: "删除成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: 400,
      message: "删除失败，请联系程序员",
    });
  }
};

// 恢复数据
const delRecycles = async (req, res, next) => {
  try {
    let bob = await del(user1, {
      id: req.body.id,
    });
    if (bob == 0) {
      res.send({
        code: 400,
        message: "恢复失败，请联系程序员",
      });
      return;
    }
    res.send({
      code: 200,
      message: "恢复成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: 400,
      message: "恢复失败，请联系程序员",
    });
  }
};
module.exports = {
  getCtr,
  postCtr,
  putCtr,
  delCtr,
  getCtr1,
  getCtr2,
  getCtr3,
  postCtr1, getRecycle, postRecycle, getRecycles, delRecycle, delRecycles, findTel, getCtr4
};
